Išsamus vadovas, kaip tinkinti Django bendrųjų klasių peržiūras, kad būtų sukurtas galingas ir efektyvus žiniatinklio sprendimas.
Django klasės peržiūros: Generalizuotų peržiūrų pritaikymo įvaldymas
Django klasės peržiūros (CBV) suteikia galingą ir daugkartinio naudojimo būdą kuriant žiniatinklio programas. Bendrosios peržiūros, CBV pogrupis, siūlo paruoštus sprendimus dažniausiai pasitaikantiems uždaviniams, tokiems kaip sąrašų rodymas, detalių peržiūros, objektų kūrimas, atnaujinimas ir trynimas. Nors šios bendrosios peržiūros yra nepaprastai patogios, joms dažnai reikia pritaikymo, kad jos puikiai atitiktų jūsų programos specifinius poreikius. Šis išsamus vadovas nagrinėja įvairius Django bendrųjų peržiūrų tinkinimo būdus, suteikiant jums galimybę kurti efektyvias ir prižiūrimas žiniatinklio programas.
Django klasių peržiūrų supratimas
Prieš pasineriant į tinkinimą, apžvelkime CBV ir bendrųjų peržiūrų pagrindus. Tradicinės funkcijų peržiūros (FBV) tvarko HTTP užklausas tiesiogiai vienoje funkcijoje. CBV, kita vertus, organizuoja peržiūrų logiką į klases, suteikdamos struktūriškesnį ir objektų orientuotą požiūrį. Tai lemia geresnę kodo organizaciją, daugkartinį naudojimą ir testuojamumą.
Bendrosios peržiūros yra paruoštos CBV, skirtos atlikti dažniausiai pasitaikančias žiniatinklio kūrimo užduotis. Jos paveldi iš pagrindinių klasių, tokių kaip View
ir TemplateView
, ir siūlo specializuotas funkcijas. Dažnos bendrosios peržiūros apima:
ListView
: Rodo objektų sąrašą.DetailView
: Rodo vieno objekto detales.CreateView
: tvarko objektų kūrimą naudojant formą.UpdateView
: tvarko objektų atnaujinimą naudojant formą.DeleteView
: tvarko objektų trynimą.
Šios bendrosios peržiūros suteikia tvirtą pagrindą, tačiau realaus pasaulio programoms dažnai reikia pritaikyti jų veikimą. Nagrinėkime įvairius tinkinimo būdus.
Tinkinimo būdai
Yra keletas būdų, kaip tinkinti Django bendrąsias peržiūras, pradedant nuo paprastų atributų perrašymo iki sudėtingesnio metodų perrašymo. Tinkamas būdas priklauso nuo reikiamo tinkinimo lygio.
1. Atributų perrašymas
Paprastiausia tinkinimo forma apima bendrųjų peržiūrų klasių atributų perrašymą. Tai idealiai tinka pagrindinėms savybėms, tokioms kaip modelis, šablono pavadinimas ar konteksto objekto pavadinimas, keisti.
Pavyzdys: ListView
tinkinimas
Tarkime, norite rodyti straipsnių sąrašą, tačiau norite naudoti pasirinktinį šabloną ir kitokį konteksto objekto pavadinimą.
from django.views.generic import ListView
from .models import Article
class ArticleListView(ListView):
model = Article
template_name = 'articles/article_list.html'
context_object_name = 'articles'
def get_queryset(self):
return Article.objects.filter(is_published=True).order_by('-publication_date')
Šiame pavyzdyje perrašėme model
, template_name
ir context_object_name
atributus. Taip pat perrašėme get_queryset
metodą, kad filtruotumėme straipsnius ir tvarkytume juos pagal publikavimo datą. get_queryset
metodas suteikia jums kontrolę, kurie objektai yra įtraukti į sąrašo peržiūrą. Tai naudinga filtruojant, tvarkant ir skaidant.
2. Metodų perrašymas
Metodų perrašymas leidžia modifikuoti esamų bendrųjų peržiūrų klasių metodų veikimą. Tai suteikia didesnę kontrolę per peržiūros logiką. Dažniausiai perrašomi metodai apima:
get_queryset()
: Kontroliuoja peržiūros naudojamą duomenų rinkinį.get_context_data()
: Prideda duomenis prie šablono konteksto.form_valid()
: tvarko sėkmingą formos pateikimą.form_invalid()
: tvarko netinkamą formos pateikimą.get_success_url()
: Nustato URL, į kurį bus perskirtoma po sėkmingo formos pateikimo.get_object()
: Išgauna objektąDetailView
,UpdateView
irDeleteView
.
Pavyzdys: DetailView
tinkinimas
Tarkime, norite rodyti straipsnio detales, tačiau taip pat norite įtraukti susijusius komentarus į šablono kontekstą.
from django.views.generic import DetailView
from .models import Article, Comment
class ArticleDetailView(DetailView):
model = Article
template_name = 'articles/article_detail.html'
context_object_name = 'article'
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['comments'] = Comment.objects.filter(article=self.object, is_approved=True)
return context
Čia perrašėme get_context_data()
metodą, kad įtrauktume comments
kintamąjį į šablono kontekstą. Tai leidžia lengvai pasiekti ir rodyti susijusius komentarus article_detail.html
šablone.
3. Mišinių naudojimas
Mišiniai yra daugkartinio naudojimo klasės, suteikiančios specifinę funkcionalumą. Jos gali būti derinamos su bendromis peržiūromis, kad būtų pridėtos funkcijos nepažeidžiant peržiūros pagrindinės logikos. Django siūlo keletą įtaisytųjų mišinių, taip pat galite kurti savo.
Pavyzdys: LoginRequiredMixin
naudojimas
LoginRequiredMixin
užtikrina, kad tik prisijungę vartotojai gali pasiekti konkrečią peržiūrą.
from django.views.generic import CreateView
from django.contrib.auth.mixins import LoginRequiredMixin
from .models import Article
from .forms import ArticleForm
class ArticleCreateView(LoginRequiredMixin, CreateView):
model = Article
form_class = ArticleForm
template_name = 'articles/article_form.html'
success_url = '/articles/' # Pakeiskite norimu sėkmės URL
def form_valid(self, form):
form.instance.author = self.request.user
return super().form_valid(form)
Šiame pavyzdyje naudojome LoginRequiredMixin
, kad apribotume prieigą prie ArticleCreateView
tik prisijungusiems vartotojams. Taip pat perrašėme form_valid
metodą, kad automatiškai nustatytume straipsnio autorių kaip esamą vartotoją. Tai parodo, kaip mišiniai gali būti derinami su metodų perrašymu, siekiant sudėtingo pritaikymo.
Savo mišinių kūrimas
Taip pat galite kurti savo mišinius, kad įkapsuliuotumėte daugkartinio naudojimo logiką. Pavyzdžiui, galite sukurti mišinį, kuris automatiškai nustato esamą vartotoją kaip modelio instancijos autorių, arba mišinį, kuris tvarko leidimų patikras.
from django.contrib.auth.mixins import UserPassesTestMixin
class AuthorRequiredMixin(UserPassesTestMixin):
def test_func(self):
return self.request.user.is_staff or (self.request.user == self.get_object().author)
def handle_no_permission(self):
# Pakeiskite norimu perskirstymu arba klaidų apdorojimu
return redirect('permission_denied') # Arba sukelti išimtį
Šis AuthorRequiredMixin
leidžia prieigą tik personalo nariams arba objekto autoriui. Galite naudoti šį mišinį su UpdateView
arba DeleteView
, kad užtikrintumėte, jog tik įgalioti vartotojai gali modifikuoti ar trinti objektus.
4. Šablonų tinkinimas
Nors aukščiau pateikti metodai sutelkia dėmesį į peržiūros logikos modifikavimą, šablonų tinkinimas yra labai svarbus duomenų pateikimo valdymui. Bendrosios peržiūros naudoja šablonus HTML išvesties generavimui. Galite tinkinti šiuos šablonus, kad jie atitiktų jūsų programos dizainą ir prekės ženklą.
Šablonų pavadinimų konvencijos
Bendrosios peržiūros laikosi specifinių šablonų pavadinimų konvencijų. Pavyzdžiui:
ListView
:<app_name>/<model_name>_list.html
(pvz.,articles/article_list.html
)DetailView
:<app_name>/<model_name>_detail.html
(pvz.,articles/article_detail.html
)CreateView
/UpdateView
:<app_name>/<model_name>_form.html
(pvz.,articles/article_form.html
)DeleteView
:<app_name>/<model_name>_confirm_delete.html
(pvz.,articles/article_confirm_delete.html
)
Galite perrašyti template_name
atributą peržiūros klasėje, kad naudotumėte kitą šabloną. Šablone galite pasiekti peržiūros teikiamus duomenis per konteksto objektą. Numatytasis konteksto objekto pavadinimas paprastai yra modelio pavadinimo mažoji raidė (pvz., article
, jei modelis yra Article
). Galite pakeisti tai naudodami context_object_name
atributą.
Pavyzdys: ListView
šablono tinkinimas
articles/article_list.html
šablone galite pereiti per articles
konteksto kintamąjį (kaip apibrėžta aukščiau pateiktame ArticleListView
pavyzdyje), kad rodytumėte straipsnių sąrašą.
<h1>Straipsniai</h1>
<ul>
{% for article in articles %}
<li><a href="{% url 'article_detail' article.pk %}">{{ article.title }}</a></li>
{% endfor %}
</ul>
5. Formos tinkinimas (CreateView & UpdateView)
CreateView
ir UpdateView
remiasi Django formomis, kad tvarkytų vartotojo įvestį. Šių formų tinkinimas leidžia kontroliuoti rodomus laukus, jų validavimo taisykles ir jų išvaizdą.
form_class
naudojimas
Galite nurodyti formos klasę, kuri bus naudojama su form_class
atributu peržiūros klasėje. Jei nenurodysite formos klasės, Django automatiškai sugeneruos ModelForm
, pagrįstą su peržiūra susietu modeliu.
Formos metodų perrašymas
Galite perrašyti metodus savo formos klasėje, kad tinkintumėte jos veikimą. Dažniausiai perrašomi metodai apima:
__init__()
: Inicializuoja formą ir modifikuoja jos laukus.clean()
: Atlieka pasirinktinį validavimą keliuose laukuose.clean_<field_name>()
: Atlieka pasirinktinį validavimą konkrečiam laukui.
Pavyzdys: Straipsnio formos tinkinimas
from django import forms
from .models import Article
class ArticleForm(forms.ModelForm):
class Meta:
model = Article
fields = ['title', 'content', 'is_published']
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.fields['content'].widget = forms.Textarea(attrs={'rows': 5})
def clean_title(self):
title = self.cleaned_data['title']
if len(title) < 5:
raise forms.ValidationError("Title must be at least 5 characters long.")
return title
Šiame pavyzdyje tinkiname ArticleForm
, nustatydami fields
atributą Meta
klasėje, kad nurodytume, kurie laukai turėtų būti įtraukti į formą. Taip pat perrašėme __init__()
metodą, kad tinkintume content
lauko valdiklį, ir clean_title()
metodą, kad pridėtume pasirinktinį title
lauko validavimą.
6. Dinaminis formos apdorojimas
Kartais jums reikia dinamiškai koreguoti formą, atsižvelgiant į vartotoją ar kitus veiksnius. Tai galite pasiekti perrašydami get_form_kwargs()
metodą peržiūros klasėje. Šis metodas leidžia perduoti papildomus raktinius argumentus formos konstruktoriui.
Pavyzdys: Vartotojo perdavimas į formą
from django.views.generic import CreateView
from .models import Article
from .forms import ArticleForm
class ArticleCreateView(CreateView):
model = Article
form_class = ArticleForm
template_name = 'articles/article_form.html'
success_url = '/articles/' # Pakeiskite norimu sėkmės URL
def get_form_kwargs(self):
kwargs = super().get_form_kwargs()
kwargs['user'] = self.request.user
return kwargs
Tada jūsų ArticleForm
galite pasiekti vartotoją per user
raktinį argumentą __init__()
metode.
from django import forms
from .models import Article
class ArticleForm(forms.ModelForm):
class Meta:
model = Article
fields = ['title', 'content', 'is_published']
def __init__(self, *args, **kwargs):
self.user = kwargs.pop('user', None)
super().__init__(*args, **kwargs)
if self.user and not self.user.is_staff:
del self.fields['is_published'] # Tik personalas gali skelbti
Šiame pavyzdyje perduodame esamą vartotoją į formą ir dinamiškai pašaliname is_published
lauką, jei vartotojas nėra personalo narys. Tai parodo, kaip galite dinamiškai koreguoti formą, atsižvelgiant į vartotojo leidimus.
Išplėstinis pritaikymas: peržiūrų rinkinių naudojimas
Sudėtingesnėms programoms, ypač toms, kurios apima API, apsvarstykite galimybę naudoti Django REST Framework (DRF) peržiūrų rinkinius. Peržiūrų rinkiniai sujungia susijusias peržiūras (pvz., sąrašas, kūrimas, gavimas, atnaujinimas, trynimas) į vieną klasę, suteikdamos švaresnį ir labiau organizuotą būdą valdyti API galinius punktus.
Pavyzdys: Straipsnių peržiūrų rinkinio kūrimas
from rest_framework import viewsets
from .models import Article
from .serializers import ArticleSerializer
class ArticleViewSet(viewsets.ModelViewSet):
queryset = Article.objects.all()
serializer_class = ArticleSerializer
Šis paprastas ArticleViewSet
suteikia visas standartines CRUD (kurti, skaityti, atnaujinti, trinti) operacijas straipsniams. Galite tinkinti peržiūrų rinkinius naudojant panašius metodus kaip ir bendrąsias peržiūras, pavyzdžiui, perrašydami metodus, tokius kaip get_queryset()
, perform_create()
ir perform_update()
.
Bendrosios aplinkybės, susijusios su bendrųjų peržiūrų tinkinimu
Tinkindami bendrąsias peržiūras visai auditorijai, turėkite omenyje šiuos aspektus:
- Lokalizavimas ir tarptautinimas (L10n/I18n): Užtikrinkite, kad jūsų šablonai ir formos palaikytų kelias kalbas ir regioninius formatus. Naudokite Django įtaisytąsias i18n/l10n funkcijas.
- Laiko zonos: Tinkamai tvarkykite laiko zonos konvertavimą, kad rodytumėte datas ir laikus vartotojo vietiniu laiku. Naudokite Django
timezone
modulį. - Valiutos formatavimas: Tinkamai formatuokite valiutos reikšmes įvairiems regionams. Valiutos formatavimui apsvarstykite galimybę naudoti biblioteką, tokią kaip
babel
. - Datos ir skaičių formatavimas: Naudokite tinkamus datos ir skaičių formatus, pagrįstus vartotojo lokalumu.
- Prieinamumas: Užtikrinkite, kad jūsų tinkintos peržiūros ir šablonai būtų prieinami vartotojams su negalia. Laikykitės prieinamumo gairių, tokių kaip WCAG.
- Reaguojantis dizainas: Įsitikinkite, kad jūsų šablonai yra reaguojantys ir prisitaiko prie skirtingų ekrano dydžių bei vartotojų naudojamų įrenginių visame pasaulyje.
- Kultūrinis jautrumas: Kurdami peržiūras ir šablonus, atsižvelkite į kultūrinius skirtumus. Venkite naudoti vaizdus ar kalbą, kuri gali būti įžeidianti tam tikroms kultūroms. Pavyzdžiui, spalvų asociacijos ir simboliai gali turėti labai skirtingas reikšmes skirtingose kultūrose.
Pavyzdys: Laiko zonų apdorojimas
Norėdami rodyti publikavimo datą vartotojo vietiniu laiku, galite naudoti timezone
žymę savo šablone:
{% load tz %}
<p>Paskelbta: {% timezone article.publication_date %}</p>
Įsitikinkite, kad jūsų Django nustatymų faile yra USE_TZ = True
.
Bendrosios peržiūrų tinkinimo geriausios praktikos
Laikykitės šių geriausių praktikų, kad jūsų pritaikymai būtų lengvai prižiūrimi ir efektyvūs:
- Laikykitės paprastumo: Venkite pernelyg sudėtingų pritaikymų. Naudokite paprasčiausią metodą, kuris pasiekia norimą rezultatą.
- Dokumentuokite savo kodą: Pridėkite komentarus, kad paaiškintumėte savo pritaikymus ir kodėl jie buvo būtini.
- Išsamiai testuokite: Rašykite vienetinius testus, kad užtikrintumėte, jog jūsų pritaikymai veikia tinkamai.
- Naudokite mišinius protingai: Kurkite daugkartinio naudojimo mišinius, kad įkapsuliuotų bendrą funkcionalumą.
- Laikykitės Django konvencijų: Laikykitės Django kodavimo stiliaus ir pavadinimų konvencijų.
- Apsvarstykite saugumą: Būkite atsargūs dėl galimų saugumo pažeidžiamumų tinkindami peržiūras. Valykite vartotojo įvestį ir saugokitės nuo dažniausių atakų, tokių kaip Cross-Site Scripting (XSS) ir SQL Injection.
Išvada
Django klasės bendrosios peržiūros suteikia galingą ir lankstų būdą kurti žiniatinklio programas. Įvaldydami šiame vadove išdėstytus tinkinimo būdus, galite pritaikyti bendrąsias peržiūras savo specifiniams poreikiams, kurdami efektyvias, prižiūrimas ir globaliai prieinamas žiniatinklio programas. Nuo paprastų atributų perrašymų iki sudėtingo metodų perrašymo ir mišinių naudojimo – galimybės yra plačios. Nepamirškite atsižvelgti į globalias perspektyvas ir geriausias praktikas, kad jūsų programos atitiktų įvairią tarptautinę auditoriją.